#include "main.h"

// P35:SPI_CS
// P30:SPI_CLK
// P31:SPI_MISO
// P32:SPI_MOSI
static void SPI_GPIO_Config(void)
{
	SYS_SET_IOCFG(IOP35CFG, SYS_IOCFG_P35_SPI0_SS);
	SYS_SET_IOCFG(IOP30CFG, SYS_IOCFG_P30_SPI0_CLK);
	SYS_SET_IOCFG(IOP31CFG, SYS_IOCFG_P31_SPI0_MISO);
	//SYS_SET_IOCFG(IOP32CFG, SYS_IOCFG_P32_SPI0_MOSI);	
    
    SC60228_SPI_NSS_HIGH();
}

static void SPI_Channel_Config(void)
{
	/*(1)开启 SSP 模块时钟*/
	SYS_EnablePeripheralClk(SYS_CLK_SSP_MSK);	
	//SSP_ConfigClk(31, 8); //-250K
	SSP_ConfigClk(31, 4); //-500K
	//SSP_ConfigClk(15, 4); //-1M
	//SSP_ConfigClk(15, 2); //-2M 
	//SSP_ConfigClk(7, 2); //- 4M 
	//SSP_ConfigClk(7, 1);	-8M
	/*(2)设置 SSP 运行模式*/							
	SSP_ConfigRunMode(SSP_FRAME_SPI, SSP_CPO_0, SSP_CPHA_1, SSP_DAT_LENGTH_16);	   
	/*(3)设置 SPI 控制模式*/
	SSP_EnableMasterMode();	            // 设置SPI为主控模式
	//SSP_DisableMasterAutoControlCS();	// 关闭主控模式下SPI自动控制片选（CS）信号
	SSP_EnableMasterAutoControlCS();
	//SC60228_SPI_NSS_HIGH();
	
	//SSP ->IMSC = 0x02;//SSP_EnableReciveTimerOverflowInt
	
	//NVIC_SetPriority(SSP0_IRQn, 1);	
//	NVIC_EnableIRQ(SSP0_IRQn);	
	
	/*(4)开启 SPI */
	SSP_Start();
	
	//SSP->DAT = 0xFFFF; 
}

void SC60228_Init(void)
{
    SPI_GPIO_Config();
    SPI_Channel_Config();
}

/*
static uint16_t SPI_ReadWriteByte(uint16_t tx_data)
{
	uint16_t retry;	

	retry = 0;	
	while(SSP->STAT & SSP_STAT_BSY_Msk)      // 等待 SPI 空闲
	{
		retry++;
		if(retry > 250)
		{
			return 0;
		}	
	}
	retry = 0;	
	while(!(SSP->STAT & SSP_STAT_TNF_Msk))  // 等待发送FIFO未满
	{
		retry++;
		if(retry > 250)
		{
			return 0;
		}	
	}

	SSP->DAT = tx_data;

	retry = 0;	
	while(!(SSP->STAT & SSP_STAT_RNE_Msk))   // 等待接收FIFO非空	
	{
		retry++;
		if(retry > 250)
		{
			return 0;
		}
	}

	return (SSP->DAT & 0xFFFF);
}
*/

uint16_t SC60228_Data;
static uint16_t SPI_Data;
static uint8_t Encoder_NEG = 0; //
void SC60228_Update(void)
{
	//SC60228_SPI_NSS_LOW();
	SPI_Data = SSP->DAT;//SPI_ReadWriteByte(0xFFFF);	
	//SC60228_SPI_NSS_HIGH();

	if(Encoder_NEG == 0)
	{
		SC60228_Data = 0x0FFF - (SPI_Data >> 4);
	}
	else
	{
		SC60228_Data = SPI_Data >> 4;
	}
}

/****************************************************************************
 ** \brief	SSP0_IRQHandler
 **
 ** \param [in]  none   
 ** \return none
 ** \note
****************************************************************************/
void SSP0_IRQHandler(void)
{
	SSP->ICLR |= 0x02;
	SC60228_Update();
	//SSP->DAT = 0xFFFF; 
}

